package initialize

import (
	"encoding/json"
	"fmt"
	"github.com/nacos-group/nacos-sdk-go/clients"
	"github.com/nacos-group/nacos-sdk-go/common/constant"
	"github.com/nacos-group/nacos-sdk-go/vo"
	"github.com/spf13/viper"
	"go.uber.org/zap"
	"mxshop-api/userop-web/global"
)

func GetEnvInfo(env string) bool {
	viper.AutomaticEnv()
	return viper.GetBool(env)
	//刚才设置的环境变量 想要生效 我们必须得重启goland
}

func InitConfig() {
	debug := GetEnvInfo("MXSHOP_DEBUG")
	configFilePrefix := "config"
	configFileName := fmt.Sprintf("userop-web/%s-pro.yaml", configFilePrefix)
	if debug {
		configFileName = fmt.Sprintf("userop-web/%s-debug.yaml", configFilePrefix)
	}

	v := viper.New()
	//文件的路径如何设置
	v.SetConfigFile(configFileName)
	if err := v.ReadInConfig(); err != nil {
		zap.S().Panic(err)
	}
	// 这个对象如何在其他文件中使用 - 全局变量
	//serverConfig := config.ServerConfig{}
	if err := v.Unmarshal(&global.NacosConfig); err != nil {
		zap.S().Panic(err)
	}

	////viper的功能 - 动态监控变化
	//v.WatchConfig()
	//v.OnConfigChange(func(e fsnotify.Event) {
	//	zap.S().Infof("配置文件产生变化: %s", e.Name)
	//	_ = v.ReadInConfig()
	//	_ = v.Unmarshal(&global.ServerConfig)
	//	zap.S().Infof("配置信息: %v", global.ServerConfig)
	//})

	// 从 nacos 读取配置信息
	serverConfigs := []constant.ServerConfig{
		*constant.NewServerConfig(
			global.NacosConfig.Host,
			uint64(global.NacosConfig.Port),
			constant.WithScheme("http"),
			constant.WithContextPath("/nacos"),
		),
	}

	clientConfig := *constant.NewClientConfig(
		constant.WithNamespaceId(global.NacosConfig.Namespace),
		constant.WithTimeoutMs(5000),
		constant.WithNotLoadCacheAtStart(true),
		constant.WithLogDir("tmp/nacos/log"),
		constant.WithCacheDir("tmp/nacos/cache"),
		constant.WithLogLevel("debug"),
	)

	configClient, err := clients.CreateConfigClient(map[string]interface{}{
		"serverConfigs": serverConfigs,
		"clientConfig":  clientConfig,
	})
	if err != nil {
		zap.S().Panic(err)
	}

	content, err := configClient.GetConfig(vo.ConfigParam{
		DataId: global.NacosConfig.DataId,
		Group:  global.NacosConfig.Group})
	if err != nil {
		zap.S().Panic(err)
	}

	//fmt.Println(content) //字符串 - yaml
	//想要将一个json字符串转换成struct，需要去设置这个struct的tag
	err = json.Unmarshal([]byte(content), &global.ServerConfig)
	if err != nil {
		zap.S().Fatalf("[userop-web] 读取 nacos 配置失败: %s", err.Error())
	}
	zap.S().Debug("[userop-web] 初始化 配置信息: config 完成")
}
